From 54fd0f2fb951dc499e51ff52c36d2c20cba4c7c5 Mon Sep 17 00:00:00 2001 From: "emellor@leeni.uk.xensource.com" Date: Tue, 13 Dec 2005 18:07:51 +0000 Subject: [PATCH] When we see a httplib.BadStatusLine, sleep 5 seconds and then retry. This happens when Xend crashes, so retrying once allows it to restart and recover. If we see Xend crash twice, we give up, but throw a more polite exception than the BadStatusLine splat that we got previously. Signed-off-by: Ewan Mellor --- tools/python/xen/xend/XendProtocol.py | 44 ++++++++++++++++++--------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/tools/python/xen/xend/XendProtocol.py b/tools/python/xen/xend/XendProtocol.py index 20b6149577..cb1e0f7f99 100644 --- a/tools/python/xen/xend/XendProtocol.py +++ b/tools/python/xen/xend/XendProtocol.py @@ -13,10 +13,12 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #============================================================================ # Copyright (C) 2004, 2005 Mike Wray +# Copyright (C) 2005 XenSource Ltd. #============================================================================ import socket import httplib +import time import types from encode import * @@ -165,24 +167,38 @@ class HttpXendClientProtocol(XendClientProtocol): @param method: http method: POST or GET @param args: request arguments (dict) """ - self.request = self.makeRequest(url, method, args) - conn = self.makeConnection(url) - if DEBUG: conn.set_debuglevel(1) - conn.request(method, url.fullpath(), self.request.data, self.request.headers) - resp = conn.getresponse() - self.resp = resp - val = self.handleStatus(resp.version, resp.status, resp.reason) - if val is None: - data = None - else: - data = resp.read() - conn.close() - val = self.handleResponse(data) - return val + retries = 0 + while retries < 2: + self.request = self.makeRequest(url, method, args) + conn = self.makeConnection(url) + try: + if DEBUG: conn.set_debuglevel(1) + conn.request(method, url.fullpath(), self.request.data, + self.request.headers) + try: + resp = conn.getresponse() + self.resp = resp + val = self.handleStatus(resp.version, resp.status, + resp.reason) + if val is None: + data = None + else: + data = resp.read() + val = self.handleResponse(data) + return val + except httplib.BadStatusLine: + retries += 1 + time.sleep(5) + finally: + conn.close() + + raise XendError("Received invalid response from Xend, twice.") + def getHeader(self, key): return self.resp.getheader(key) + class UnixConnection(httplib.HTTPConnection): """Subclass of Python library HTTPConnection that uses a unix-domain socket. """ -- 2.30.2